<?php

App::import('Sanitize');

class FotosController extends AppController {

    var $name = 'Fotos';
    var $paginate = array(
        'recursive' => 0,
        'order' => array('Foto.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        parent::beforeFilter();
        //$this->Auth->allow();
    }

    function __mime_content_type($filename) {
        $mime_types = array(
            // images
            'png' => 'image/png',
            'jpe' => 'image/jpeg',
            'jpeg' => 'image/jpeg',
            'jpg' => 'image/jpeg',
            'gif' => 'image/gif',
            'bmp' => 'image/bmp',
            'ico' => 'image/vnd.microsoft.icon',
            'tiff' => 'image/tiff',
            'tif' => 'image/tiff',
            'svg' => 'image/svg+xml',
            'svgz' => 'image/svg+xml',
        );

        $ext = strtolower(array_pop(explode('.', $filename)));
        if (array_key_exists($ext, $mime_types)) {
            return true;
        } else {
            return false;
        }
    }

    function add_foto() {
        $this->__aux_add_foto();
    }

    function admin_add_foto() {
        $this->__aux_add_foto();
    }

    /**
     * Permite dar de alta una fotografía de una obra de arte
     */
    function __aux_add_foto() {
        $this->layout = false;

        if ($this->Session->check('id_obra')) {
            $obra_id = $this->Session->read('id_obra');
            if (!empty($this->data)) {
                $this->data['Foto']['obra_id'] = $obra_id;
                $this->__save_foto($obra_id, $this->data, $_FILES);
            }
            $referer = $this->referer();
            $this->set(compact('referer'));
            $this->render('add_foto');
        } else {
            $mensaje = 'Para poder cargar fotografías, primero debe dar de alta una obra de arte en la sopala "General"';
            $this->redirect(array('controller' => 'obras', 'action' => 'admin_advertencia', $mensaje));
        }
    }

    function view_fotos() {
        $this->__aux_view_fotos();
    }

    function admin_view_fotos() {
        $this->__aux_view_fotos();
    }

    /**
     * Lista todas las fotos de la obra que se está dando de alta
     */
    function __aux_view_fotos() {
        $this->layout = false;
        $obra_id = ($this->Session->check('id_obra')) ? $this->Session->read('id_obra') : 0;
        $obra = $this->Foto->Obra->findById($obra_id);
        $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

        $this->set('obra_nombre', $obra_nombre);
        $this->set('fotos', $this->paginate('Foto', array('Foto.obra_id' => $obra_id)));
        $this->render('view_fotos');
    }

    function delete_foto($id = null) {
        $this->__aux_delete_foto($id);
    }

    function admin_delete_foto($id = null) {
        $this->__aux_delete_foto($id);
    }

    /**
     * Elimina una foto determinada de la db y su archivo físico correspondiente
     */
    function __aux_delete_foto($id = null) {
        $this->layout = false;
        $this->Foto->begin();
        if (!empty($id)) {
            $datos_foto = $this->Foto->findById($id, array('recursive' => 0));
            if (!empty($datos_foto)) {
                if ($this->Foto->delete($id)) {
                    $foto_ext = end(explode('.', $datos_foto['Foto']['nombre']));
                    $foto_nombre = $datos_foto['Foto']['obra_id'] . '_' . $datos_foto['Foto']['id'] . '.' . $foto_ext;
                    $archivo_foto = dirname(dirname(__FILE__)) . '\files\fotos\\' . $foto_nombre;
                    if (is_file($archivo_foto)) {
                        if (@unlink($archivo_foto)) {
                            $this->Foto->commit();
                            echo 'La foto "' . $datos_foto['Foto']['nombre'] . '" se eliminó correctamente.';
                            exit;
                        } else {
                            // El archivo no se pudo eliminar
                            $this->Foto->rollback();
                            echo 'Error: El archivo no se pudo eliminar.';
                            exit;
                        }
                    } else {
                        // No se encontró el archivo pero eliminamos igual la foto de la db
                        $this->Foto->commit();
                        echo 'La foto "' . $datos_foto['Foto']['nombre'] . '" se eliminó correctamente.';
                        exit;
                    }
                } else {
                    // La foto no se pudo eliminar de la db
                    $this->Foto->rollback();
                    echo 'Error: La foto no se pudo eliminar.';
                    exit;
                }
            } else {
                // No se encontró la foto en la db
                $this->Foto->rollback();
                echo 'Error: No se encontró la foto en la db.';
                exit;
            }
        }
    }

    function edit_foto($obra_id = null) {
        $this->__aux_edit_foto($obra_id);
    }

    function admin_edit_foto($obra_id = null) {
        $this->__aux_edit_foto($obra_id);
    }

    /**
     * Permite editar una foto de una obra de arte
     */
    function __aux_edit_foto($obra_id = null) {
        $this->layout = false;
        if (!empty($this->data)) {
            $obra_id = (isset($this->data['Foto']['obra_id']) && (!empty($this->data['Foto']['obra_id']))) ? $this->data['Foto']['obra_id'] : 0;
            $this->__save_foto($obra_id, $this->data, $_FILES);
        }
        $referer = $this->referer();
        $this->set(compact('obra_id', 'referer'));
        $this->render('edit_foto');
    }

    function view_edit_fotos($obra_id = null) {
        $this->__aux_view_edit_fotos($obra_id);
    }

    function admin_view_edit_fotos($obra_id = null) {
        $this->__aux_view_edit_fotos($obra_id);
    }

    /**
     * Lista todas las fotos de la obra que se está editando
     */
    function __aux_view_edit_fotos($obra_id = null) {
        $this->layout = false;
        if (!empty($obra_id)) {
            $obra = $this->Foto->Obra->findById($obra_id);
            $obra_nombre = (!empty($obra)) ? $obra['Obra']['nombre'] : '';

            $this->set('obra_nombre', $obra_nombre);
            $this->set('fotos', $this->paginate('Foto', array('Foto.obra_id' => $obra_id)));
            $this->render('view_edit_fotos');
        }
    }

    function read_foto($id = null) {
        $this->__aux_read_foto($id);
    }

    function admin_read_foto($id = null) {
        $this->__aux_read_foto($id);
    }

    /**
     * Recupera una foto de la db y devuelve su información
     * como un string separado por "|":
     * id|obra_id|nombre|titulo|comentario|inicial
     */
    function __aux_read_foto($id = null) {
        $foto = '';
        if (!empty($id)) {
            $elemento = $this->Foto->findById($id, array('recursive' => 0));
            if (!empty($elemento)) {
                $foto = $elemento['Foto']['id'] . '|' .
                        $elemento['Foto']['obra_id'] . '|' .
                        $elemento['Foto']['nombre'] . '|' .
                        $elemento['Foto']['titulo'] . '|' .
                        $elemento['Foto']['comentario'] . '|' .
                        $elemento['Foto']['inicial'];
            }
        }
        echo $foto;
        exit;
    }

    function __save_foto($obra_id = null, $data = null, $files = null) {
        if (!empty($obra_id) && !empty($data)) {
            $this->Foto->begin();
            // Si la foto se selecciona como "inicial", busco si existe otra foto cargada como inicial para la misma obra de arte y le seteo el atributo inicial a 0.
            if (isset($data['Foto']['inicial'])) {
                if (isset($data['Foto']['id']) && (!empty($data['Foto']['id']))) {
                    $foto_inicial = $this->Foto->find('all', array('conditions' => array('Foto.id <>' => $data['Foto']['id'], 'Foto.obra_id' => $obra_id, 'Foto.inicial' => 1)));
                } else {
                    $foto_inicial = $this->Foto->find('all', array('conditions' => array('Foto.obra_id' => $obra_id, 'Foto.inicial' => 1)));
                }
                if (!empty($foto_inicial)) {
                    foreach ($foto_inicial as $foto):
                        $foto['Foto']['inicial'] = 0;
                        $this->Foto->create();
                        $this->Foto->save($foto);
                    endforeach;
                }
            }else {
                $data['Foto']['inicial'] = 0;
            }

            if (isset($files['fileUpload']['name']) && !empty($files['fileUpload']['name'])) {
                // Definimos el directorio donde se guarda la foto
                $dir = dirname(dirname(__FILE__)) . '/files/fotos/';

                if (!@is_dir($dir)) {
                    if (!@mkdir($dir, 0777)) {
                        $this->Foto->rollback();
                        echo '<script>parent.resultadoUpload(4);</script> ';
                        exit;
                    }
                }
                $files['fileUpload']['name'] = utf8_encode(strtolower(utf8_decode(trim($files['fileUpload']['name']))));
                $data['Foto']['nombre'] = $files['fileUpload']['name'];

                //Verifico si el nombre de la foto ya existe para la misma obra
                if (isset($data['Foto']['id']) && (!empty($data['Foto']['id']))) {
                    $foto_obra = $this->Foto->find('all', array('conditions' => array('Foto.id <>' => $data['Foto']['id'], 'Foto.obra_id' => $obra_id, 'Foto.nombre' => $data['Foto']['nombre'])));
                } else {
                    $foto_obra = $this->Foto->find('all', array('conditions' => array('Foto.obra_id' => $obra_id, 'Foto.nombre' => $data['Foto']['nombre'])));
                }
                if (!empty($foto_obra)) {
                    $this->Foto->rollback();
                    echo '<script>parent.resultadoUpload(5);</script> ';
                    exit;
                }
            } elseif (isset($data['Foto']['id']) && (!empty($data['Foto']['id']))) {
                $foto = $this->Foto->findById($data['Foto']['id']);
                $data['Foto']['nombre'] = (!empty($foto)) ? $foto['Foto']['nombre'] : '';
            } else {
                $this->Foto->rollback();
                echo '<script>parent.resultadoUpload(6);</script> ';
                exit;
            }


            $this->Foto->create();
            if ($this->Foto->save($data['Foto'])) {
                $foto_id = $this->Foto->id;

                // Intentamos subir la foto
                // (1) Comprobamos que existe el nombre temporal del archivo
                if (isset($files['fileUpload']['tmp_name']) && !empty($files['fileUpload']['tmp_name'])) {
                    // (2) - Comprobamos que se trata de un archivo de imagen
                    if ($this->__mime_content_type($files['fileUpload']['name'])) {
                        $foto_ext = end(explode('.', $files['fileUpload']['name']));
                        $foto_nombre = $obra_id . '_' . $foto_id . '.' . $foto_ext;
                        // (3) Por ultimo se intenta copiar el archivo al servidor.
                        if (!copy($files['fileUpload']['tmp_name'], $dir . $foto_nombre)) {
                            $this->Foto->rollback();
                            echo '<script>parent.resultadoUpload(1);</script> ';
                            exit;
                        } else {
                            $this->Foto->commit();
                            echo '<script>parent.resultadoUpload(0);</script> ';
                            exit;
                        }
                    } else {
                        $this->Foto->rollback();
                        echo '<script>parent.resultadoUpload(2);</script> ';
                        exit;
                    }
                } elseif (isset($data['Foto']['id']) && (!empty($data['Foto']['id']))) {
                    $this->Foto->commit();
                    echo '<script>parent.resultadoUpload(0);</script> ';
                    exit;
                } else {
                    $this->Foto->rollback();
                    echo '<script>parent.resultadoUpload(3);</script> ';
                    exit;
                }
            } else {
                $this->Foto->rollback();
                echo '<script>parent.resultadoUpload(1);</script> ';
                exit;
            }
        }
    }

}
?>